﻿using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Formatters;
using System.Text;

namespace MVC高级教程.Controllers
{
    public class StudentController : Controller
    {
        //普通方法与Action方法的区别
                    //Action方法时由MVC框架管理，MVC框架可以对Action方法进行处理与渲染，(比如渲染视图、拦截请求等)，而普通方法不受mvc控制





        /// <summary>
        /// IActionResult接口的实现类：
        ///         下面这些控制器动作结果类都是IAcrtionResult的子类
        /// ViewResult，RedirectToActionResult，JsonRersult，ContentResult，RedirectResult，RedirectToRouteResult，FileResult
        /// 这里之所以用IActionResult接口类型作为返回值类型，就是为了实现返回结果的多态
        /// 另外，使用IActionResult也是为了让MVC框架去管理，在Return后MVC框架还有很多的操作要执行
        /// 
        /// 普通的返回结果类型，MVC不能管理普通的返回类型，eg：ViewResult，RedirectToActionResult，JsonRersult....等
        /// 如果需要MVC框架的管理，那就需要使用IActionResult接口类型作为返回值
        /// </summary>
        /// <returns></returns>
        public IActionResult Index()
        {
            //View()方法来自Controller类中的方法
            //View()方法返回一个ViewResult类型对象(也就是视图对象)
            return View();//无参数的重载，返回的视图对象名称和当前Action名称相同
        }

        public IActionResult Index2()
        {
            return Redirect("/Student/Index");//此种跳转可以避免跳转到缓存的页面中去

            //当Action没有返回View,就不要在Views下创建对应的试图
        }

        public IActionResult Index3()
        {
            return RedirectToAction("Index");//跳转到当前控制器中名为Index 的Action中
            //return RedirectToAction(nameof(Index));
            // return RedirectToAction("Index","Home");   //跳转到Home控制器中的 Index 方法中
        }


        /// <summary>
        /// 返回Json     
        /// 返回结果是一个JsonResult类型
        /// </summary>
        /// <returns></returns>
        public IActionResult Index4()
        { 
            List<Student> list = new()
            {
                new Student(1,"余冰"),
                new Student(2,"老赵"),
                new Student(3,"老刘")
            };

            return Json(list);
        }


        /// <summary>
        /// 也能返回Json
        /// 告诉浏览器请求响应成功了，并给出状态码200
        /// </summary>
        /// <returns></returns>
        public OkObjectResult Index5() 
        {
            List<Student> list = new()
            {
                new Student(1,"余冰"),
                new Student(2,"老赵"),
                new Student(3,"老刘")
            };

            return Ok(list);
        }


        //向浏览器返回文本
        public IActionResult Index6()
        {
            Response.WriteAsync("用Response向浏览器输出文本");
            return Content("向浏览器返回文本");
        }


        /// <summary>
        /// 返回文件
        /// 返回类型FileResult
        /// </summary>
        /// <returns></returns>
        public IActionResult Down()
        {
            MemoryStream stream = new();
            string content = "我叫余冰我住在三堡刘庄";
            stream.Write(Encoding.UTF8.GetBytes(content));
            
            return File(
                stream,
                "application/octet-stream",//媒体类型，不要乱写，不同文件类型对应不同媒体类型，否则无法下载
                "file.txt"
                );//File()方法返回值类型为 FileResult
        }
    }

    public record Student(int Id,string Name);
}
